import { _decorator, Vec3, Node, Component, Contact2DType, Collider2D, randomRange, tween } from 'cc';
import { EGroup, EnemyManager } from '../EnemyManager';

const { ccclass } = _decorator;

@ccclass('DragEnemy')
export class DragEnemy extends Component {
    // 中心区域半径（敌人被拉到的范围）
    private centerRadius: number = 1.0;
    // 最小距离（避免敌人完全重叠）
    private minDistance: number = 1;
    // 缓动持续时间（秒）
    private tweenDuration: number = 0.7;

    protected onEnable(): void {
        let collider = this.node.getComponent(Collider2D);
        collider?.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this);
    }

    protected onDisable(): void {
        let collider = this.node.getComponent(Collider2D);
        collider?.off(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this);
    }

    onBeginContact(self: Collider2D, other: Collider2D) {
        if (other.group === EGroup.ENEMY) {
            const enemyManager = other.node.getComponent(EnemyManager);
            if (enemyManager) {
                this.pullEnemyToCenter(enemyManager.node);
            }
        }

        
    }

    /**
     * 将敌人拉向中心区域，保持相对方向（使用缓动动画）
     * @param enemyNode 敌人节点
     */
    private pullEnemyToCenter(enemyNode: Node) {
        const centerPos = this.node.position;
        const enemyPos = enemyNode.position;
        
        // 计算敌人相对于中心的方向向量
        const direction = new Vec3(
            enemyPos.x - centerPos.x,
            enemyPos.y - centerPos.y,
            0
        );
        
        // 计算当前距离
        const currentDistance = Vec3.distance(centerPos, enemyPos);
        
        // 如果已经足够近，则不再处理
        if (currentDistance <= this.minDistance) return;
        
        // 归一化方向向量（保持方向）
        Vec3.normalize(direction, direction);
        
        // 计算目标距离（在中心区域内随机）
        const targetDistance = randomRange(this.minDistance, this.centerRadius);
        
        // 计算新位置 = 中心位置 + 方向 * 目标距离
        const newPos = new Vec3(
            centerPos.x + direction.x * targetDistance,
            centerPos.y + direction.y * targetDistance,
            0
        );
        
        // 使用缓动动画移动敌人
        tween(enemyNode)
            .to(this.tweenDuration, { position: newPos })
            .start();
    }
}